/**
 * 页面导航工具模块
 * 提供增强的页面导航功能，支持事件通信和数据传递
 */

/**
 * 带有事件通信的页面导航工具
 * 封装了 uni.navigateTo 和 eventChannel，支持页面间数据传递和回调处理
 *
 * @param {Object} options - 配置项
 * @param {string} options.url - 目标页面路径
 * @param {Object} [options.params={}] - 查询参数
 * @param {Object} [options.events={}] - 自定义事件处理器
 * @param {Function} [options.events.init] - 初始化事件处理函数，接收eventChannel作为参数
 * @param {Function} [options.events.success] - 成功事件处理函数
 * @returns {Promise} 返回目标页面通过 eventChannel 传递的数据
 *
 * @example
 * // 基础用法
 * navigateWithChannel({
 *   url: '/pages/detail',
 *   params: { id: 1 }
 * }).then(result => {
 *   console.log('返回结果:', result)
 * })
 *
 * // 使用 init 事件配置页面
 * navigateWithChannel({
 *   url: '/pages/selector',
 *   events: {
 *     init: (eventChannel) => {
 *       // 通过 eventChannel 发送初始化配置
 *       eventChannel.emit('initConfig', { multiple: true, preselected: ['1', '2'] })
 *     }
 *   }
 * })
 *
 * // 自定义事件处理
 * navigateWithChannel({
 *   url: '/pages/form',
 *   events: {
 *     submit: (data) => console.log(data)
 *   }
 * })
 */
export const navigateWithChannel = ({ url, params = {}, events = {} }) => {
  return new Promise((resolve, reject) => {
    // 构建带参数的URL
    const queryString = Object.keys(params)
      .map(key => `${key}=${encodeURIComponent(String(params[key]))}`)
      .join('&')

    const fullUrl = queryString ? `${url}?${queryString}` : url

    // 创建自定义事件处理器
    const navEvents = {
      success: data => resolve(data),
    }

    // 合并自定义事件处理器（除了 init）
    Object.keys(events).forEach(key => {
      if (key !== 'init' && typeof events[key] === 'function') navEvents[key] = events[key]
    })

    try {
      // 打开页面
      uni.navigateTo({
        url: fullUrl,
        events: navEvents,
        success: res => {
          // uni-app 规范：获取 eventChannel
          const eventChannel = res.eventChannel

          // 如果有 init 事件处理器，调用它并传入 eventChannel
          if (eventChannel && events.init) events.init(eventChannel)
        },
        fail: err => reject(new Error(err.errMsg)),
      })
    } catch (error) {
      reject(new Error('页面导航失败: ' + error.message))
    }
  })
}

/**
 * 在目标页面中获取并使用 eventChannel
 *
 * @example
 * // 在目标页面的onLoad或onReady中使用
 * const eventChannel = getEventChannel()
 *
 * // 监听初始化配置
 * eventChannel?.on('initConfig', config => {
 *   // 处理配置
 *   console.log('收到配置:', config)
 * })
 *
 * // 向来源页面发送数据
 * eventChannel?.emit('success', { result: 'done' })
 *
 * @returns {Object|null} 返回事件通道对象，如果无法获取则返回null
 */
export const getEventChannel = () => {
  try {
    const pages = getCurrentPages()
    const currentPage = pages && pages.length > 0 ? pages[pages.length - 1] : null
    const channel = currentPage.getOpenerEventChannel && currentPage.getOpenerEventChannel()

    if (!channel) console.warn('获取eventChannel失败！')

    return channel || null
  } catch (error) {
    console.error('获取eventChannel失败:', error)
    return null
  }
}
